﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Waiter.Common;
using Waiter.Controler;
using DevComponents.DotNetBar.Controls;
using DevComponents.DotNetBar;

namespace Waiter.View
{
    public partial class frmPayment : DevComponents.DotNetBar.Office2007Form//Form
    {
        MasterCtrl myMasterCtrl = new MasterCtrl();
        StaffCtrl myStaffCtrl = new StaffCtrl();
        PaymentCtrl myPaymentCtrl = new PaymentCtrl();
        BindingSource myBinding = new BindingSource();
        ActionStatus myActionStatus = new ActionStatus();       //Trạng thái hiện tại của form
        public delegate void CloseForm();                       //Delegate close form
        public CloseForm myCloseForm;                           //Tạo thể hiện của delegate

        public frmPayment()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Control ẩn hiện các panel
        /// </summary>
        /// <param name="bIsEnable"></param>
        private void fsControlPanel(bool bIsEnable)
        {
            pnlHeader.Enabled = bIsEnable;
            pnlRightButton.Enabled = bIsEnable;
            grdMain.Enabled = bIsEnable;
            pnlFooter.Enabled = !bIsEnable;//Ngược với các panel khác
        }

        /// <summary>
        /// Load dữ liệu init vào các control
        /// </summary>
        private void fsLoadInitData()
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.fsLoadInitData", "", "");
            //Load combobox
            //Loại chi phí
            cmbPayClass.DataSource = myMasterCtrl.fsGetMasterFromGroupCode(CommonConstants.LOAI_CHI_PHI);
            cmbPayClass.DisplayMember = "VALUE";
            cmbPayClass.ValueMember = "CODE";

            cmbFooterPayClass.DataSource = myMasterCtrl.fsGetMasterFromGroupCode(CommonConstants.LOAI_CHI_PHI);
            cmbFooterPayClass.DisplayMember = "VALUE";
            cmbFooterPayClass.ValueMember = "CODE";

            //Hạng mục
            cmbItem.DataSource = myMasterCtrl.fsGetMasterFromGroupCode(CommonConstants.LOAI_HANG_MUC);
            cmbItem.DisplayMember = "VALUE";
            cmbItem.ValueMember = "CODE";

            cmbFooterItem.DataSource = myMasterCtrl.fsGetMasterFromGroupCode(CommonConstants.LOAI_HANG_MUC);
            cmbFooterItem.DisplayMember = "VALUE";
            cmbFooterItem.ValueMember = "CODE";

            //Nhân viên
            myStaffCtrl.fsLoadComboBox_ListStaff(cmbFooterMemberPay);

            //Ngày tháng
            datePayDateFrom.Value = DateTime.Now;
            datePayDateTo.Value = DateTime.Now;

            //Label tổng tiền
            lbSumMoney.Text = string.Empty;
        }

        /// <summary>
        /// Setting trị null cho các item tại footer
        /// </summary>
        private void fsSettingNullDataFooterControl()
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.fsSettingNullDataFooterControl", "", "");
            this.numFooterAmount.Value = 0;
            this.txtFooterNote.Text = "";
            try
            {
                this.cmbFooterMemberPay.SelectedIndex = 0;
            }
            catch (Exception)
            { }
            try
            {
                this.cmbFooterPayClass.SelectedIndex = 0;
            }
            catch (Exception)
            { }
            try
            {
                this.cmbFooterItem.SelectedIndex = 0;
            }
            catch (Exception)
            { }
        }

        /// <summary>
        /// Kiểm tra lỗi nhập điều kiện tìm kiếm
        /// </summary>
        /// <returns></returns>
        private bool fsCheckErrorInputSearchControl()
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.fsCheckErrorInputSearchControl", "", "");
            //Loại chi phí
            if (chkPayClass.Checked == true && cmbPayClass.SelectedIndex < 0)
            {
                cmbPayClass.Focus();
                MessageBoxEx.Show("Bạn chưa chọn loại chi phí", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            //Hạng mục
            if (chkItem.Checked == true && cmbItem.SelectedIndex < 0)
            {
                cmbItem.Focus();
                MessageBoxEx.Show("Bạn chưa chọn loại hạng mục", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            //Thời gian
            if (chkDateInput.Checked == true && datePayDateFrom.Value > datePayDateTo.Value)
            {
                datePayDateFrom.Focus();
                MessageBoxEx.Show("Khoảng thời điểm chi trả không đúng", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (datePayDateTo.Value == DateTime.MinValue)
            {
                datePayDateFrom.Focus();
                MessageBoxEx.Show("Bạn chưa nhập ngày tháng năm chi trả", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            return true;
        }

        /// <summary>
        /// Kiểm tra lỗi các control thêm mới
        /// </summary>
        /// <returns></returns>
        private bool fsCheckErrorInputNewControl(bool pIsAddNew)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.fsCheckErrorInputNewControl", "", "");
            if (pIsAddNew == false)
            {
                if (txtDummy.Text != string.Empty)
                {
                    MessageBoxEx.Show("Không có dữ liệu nào được chọn trên lưới.", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }
            }

            if (cmbFooterMemberPay.SelectedIndex < 0)
            {
                this.cmbFooterMemberPay.Focus();
                MessageBoxEx.Show("Bạn chưa chọn loại chi phí", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (cmbFooterItem.SelectedIndex < 0)
            {
                this.cmbFooterItem.Focus();
                MessageBoxEx.Show("Bạn chưa chọn loại hạng mục", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (cmbFooterMemberPay.SelectedIndex < 0)
            {
                this.cmbFooterMemberPay.Focus();
                MessageBoxEx.Show("Bạn chưa chọn người chi trả", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (numFooterAmount.Value <= 0)
            {
                this.numFooterAmount.Focus();
                MessageBoxEx.Show("Số tiền chi trả phải lớn hơn 0", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            return true;
        }


        /// <summary>
        /// Form load
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmPayment_Load(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.frmPayment_Load", "", "");
            myActionStatus = ActionStatus.DEFAULT;
            this.fsLoadInitData();//Load data init
            this.fsControlPanel(true);//Control các panel

        }

        /// <summary>
        /// Đóng form
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void frmPayment_FormClosing(object sender, FormClosingEventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.frmPayment_FormClosing", "", "");
            if (myCloseForm != null)//Thông báo cho form menu
                myCloseForm();
        }

        /// <summary>
        /// Load thông tin lên header
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void headerItem1_Load(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.headerItem1_Load", "", "");
            this.headerItem1.init("QUẢN LÝ CHI PHÍ", false);
            //this.headerItem1.btnChangeStyle.Visible = false;
            //this.headerItem1.btnSwitchUser.Visible = false;
            //this.headerItem1.lblShift.Visible = false;
            //this.headerItem1.lblShift1.Visible = false;
            //this.headerItem1.lblName.Text = Waiter.Properties.Settings.Default.STAFF_LOGIN_NAME;
        }

        private void btnAdd_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.btnAdd_Click", "", "");
            if (myActionStatus == ActionStatus.DEFAULT)
            {
                myActionStatus = ActionStatus.ADDING;
                this.fsControlPanel(false);
                this.fsSettingNullDataFooterControl();
                txtDummy.Text = string.Empty;
            }
        }

        /// <summary>
        /// Khi ấn button save
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSave_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.btnSave_Click", "", "");
            string strResult = string.Empty;

            if (myActionStatus == ActionStatus.ADDING && this.fsCheckErrorInputNewControl(true) == true)//Trường hợp thêm mới data
            {
                strResult = myPaymentCtrl.fsInserPayment(cmbFooterPayClass.SelectedValue.ToString(), cmbFooterItem.SelectedValue.ToString(), cmbFooterMemberPay.SelectedValue.ToString(), Convert.ToInt64(numFooterAmount.Value), txtFooterNote.Text, DateTime.Now, CommonUtils.fsGetOPID(), DateTime.Now);
                if (strResult == string.Empty)
                {
                    myActionStatus = ActionStatus.DEFAULT;
                    this.fsControlPanel(true);
                    btnSearch_Click(new object(), new EventArgs());
                    MessageBoxEx.Show("Dữ liệu đã được lưu thành công", CommonMessages.MSG_NOTICE_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBoxEx.Show(strResult, CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else//Trường hợp cập nhật data
            {
                strResult = myPaymentCtrl.fsUpdatePayment(txtDummy.Text, cmbFooterPayClass.SelectedValue.ToString(), cmbFooterItem.SelectedValue.ToString(), cmbFooterMemberPay.SelectedValue.ToString(), Convert.ToInt64(numFooterAmount.Value), txtFooterNote.Text, DateTime.Now, CommonUtils.fsGetOPID(), DateTime.Now);
                if (strResult == string.Empty)
                {
                    myActionStatus = ActionStatus.DEFAULT;
                    this.fsControlPanel(true);
                    btnSearch_Click(new object(), new EventArgs());
                    MessageBoxEx.Show("Dữ liệu đã được lưu thành công", CommonMessages.MSG_NOTICE_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBoxEx.Show(strResult, CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        /// <summary>
        /// Binding data từ grid vào các control tại footer
        /// </summary>
        /// <param name="pRowIndex"></param>
        private void fsBindingPanelInput(int pRowIndex)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.fsBindingPanelInput", "", "");
            txtDummy.Text = this.grdMain.Rows[pRowIndex].Cells["colCODE"].Value.ToString();
            cmbFooterPayClass.SelectedValue = this.grdMain.Rows[pRowIndex].Cells["colPAY_CLASS_CODE"].Value.ToString();
            cmbFooterItem.SelectedValue = this.grdMain.Rows[pRowIndex].Cells["colITEM_CODE"].Value.ToString();
            cmbFooterMemberPay.SelectedValue = this.grdMain.Rows[pRowIndex].Cells["colPAY_MEMBER_CODE"].Value.ToString();
            numFooterAmount.Value = Convert.ToInt64(this.grdMain.Rows[pRowIndex].Cells["colAMOUNT"].Value);
            txtFooterNote.Text = this.grdMain.Rows[pRowIndex].Cells["colNOTE"].Value.ToString();
        }

        private void btnSearch_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.btnSearch_Click", "", "");
            if (myActionStatus == ActionStatus.DEFAULT && this.fsCheckErrorInputSearchControl() == true)
            {
                string strPayClass = string.Empty;
                string strItem = string.Empty;
                DateTime dateFrom = DateTime.MinValue;
                DateTime dateTo = DateTime.MinValue;

                if (chkPayClass.Checked == true)
                {
                    strPayClass = cmbPayClass.SelectedValue.ToString();
                }

                if (chkItem.Checked == true)
                {
                    strItem = cmbItem.SelectedValue.ToString();
                }

                if (chkDateInput.Checked == true)
                {
                    dateFrom = datePayDateFrom.Value;
                    dateTo = datePayDateTo.Value;
                }


                myBinding.DataSource = myPaymentCtrl.fsLoadGridData(strPayClass, strItem, dateFrom, dateTo);
                grdMain.DataSource = myBinding;
                grdMain.Refresh();

                if (grdMain.Rows.Count > 0)
                {
                    this.fsBindingPanelInput(grdMain.CurrentCell.RowIndex);
                    this.fsCalcSumMoney();
                }
            }
        }

        private void fsCalcSumMoney()
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.fsCalcSumMoney", "", "");
            if (grdMain.Rows.Count > 0)
            {
                long nSumMoney = 0;
                for (int i = 0; i < grdMain.Rows.Count; i++)
                {
                    nSumMoney += Convert.ToInt64(grdMain.Rows[i].Cells["colAMOUNT"].Value);
                }

                lbSumMoney.Text = nSumMoney.ToString("C0");
            }
        }

        private void chkPayClass_CheckedChanged(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.chkPayClass_CheckedChanged", "", "");
            if (chkPayClass.Checked == true)
            {
                cmbPayClass.Enabled = true;
            }
            else
            {
                cmbPayClass.Enabled = false;
            }
        }

        private void chkItem_CheckedChanged(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.chkItem_CheckedChanged", "", "");
            if (chkItem.Checked == true)
            {
                cmbItem.Enabled = true;
            }
            else
            {
                cmbItem.Enabled = false;
            }

        }

        private void chkDateInput_CheckedChanged(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.chkDateInput_CheckedChanged", "", "");
            if (chkDateInput.Checked == true)
            {
                datePayDateFrom.Enabled = true;
                datePayDateTo.Enabled = true;
            }
            else
            {
                datePayDateFrom.Enabled = false;
                datePayDateTo.Enabled = false;
            }
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.btnCancel_Click", "", "");
            if (myActionStatus != ActionStatus.DEFAULT)
            {
                myActionStatus = ActionStatus.DEFAULT;
                this.fsControlPanel(true);
            }
        }

        private void btnBack_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.btnBack_Click", "", "");
            this.Close();
        }

        private void grdMain_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.grdMain_CellClick", "", "");
            this.fsBindingPanelInput(e.RowIndex);
        }

        private void btnUpdate_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.btnUpdate_Click", "", "");
            if (myActionStatus == ActionStatus.DEFAULT && grdMain.CurrentCell.RowIndex > 0)
            {
                myActionStatus = ActionStatus.EDITING;
                this.fsControlPanel(false);
            }
            else
            {
                MessageBoxEx.Show("Không có dòng dữ liệu nào trên lưới được chọn", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


        private void btnDelete_Click(object sender, EventArgs e)
        {
            CommonLogging.fsWriteLog(CommonConstants.LOG_TYPE_INFO, "frmPayment.btnDelete_Click", "", "");
            if (myActionStatus == ActionStatus.DEFAULT && grdMain.CurrentCell != null)
            {
                if (MessageBoxEx.Show("Bạn chắc chắn muốn xóa dòng dữ liệu được chọn?", CommonMessages.MSG_CONFIRM_TITLE, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    string strResult = myPaymentCtrl.fsDeletePayment(grdMain.Rows[grdMain.CurrentCell.RowIndex].Cells["colCODE"].Value.ToString());
                    if (strResult == string.Empty)
                    {
                        btnSearch_Click(new object(), new EventArgs());
                    }
                    else
                    {
                        MessageBoxEx.Show("Xóa dữ liệu không thành công", CommonMessages.MSG_ERR_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }
    }
}


